package com.cskaoyan.javase.twoDarray;

import java.util.Arrays;

/**
 * 杨辉三角
 * 杨辉三角（YangHui Triangle）指的是南宋时期数学家杨辉，根据北宋时期的数学家贾宪的作品（现已遗失），发现的一种几何排列规律，在数学中，它是二项式系数在三角形中的一种几何排列。大致图案如下：
 *
 * > 1
 * > 1 1
 * > 1 2 1
 * > 1 3 3 1
 * > 1 4 6 4 1
 * > 1 5 10 10 5 1
 * > ......
 * 总结规律：
 *      1.每一行的行数和它的列数是相等的。
 *      2.前两行元素都是1
 *      3.从第三行开始，首尾元素也是1，其它中间元素是同列上一行元素 + 左边一列上一行元素
 * 杨辉三角和二维数组有什么关系呢？
 * 把每行元素看成一个一维数组，杨辉三角总体就是一个二维数组
 *
 * @since 09:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        printYangHui(15);
    }

    // 打印杨辉三角，其中n是可变的参数，表示杨辉三角的行数
    public static void printYangHui(int n) {
        // 1.创建二维数组
        /*
            二维数组应该怎么创建呢？
            首先排除静态初始化
            肯定要使用动态初始化
            动态初始化有两种格式：
            格式1: m,n都给出
            格式2：只给出m
            用格式2会更好，因为一维数组的长度是不固定的，用格式1固定未n
         */
        int[][] yangHuiArr = new int[n][];
        // 动态初始化格式2，里面的一维数组还不存在，需要逐一初始化
        for (int i = 0; i < yangHuiArr.length; i++) {
            // 一维数组应该用动态初始化
            yangHuiArr[i] = new int[i + 1];
        }
        System.out.println(Arrays.deepToString(yangHuiArr));
        // 2.元素赋值
        /*
                1.前两行元素都是1
                2.从第三行开始，首尾元素也是1，其它中间元素是同列上一行元素 + 左边一列上一行元素
         */
        // 遍历二维数组
        // 这里面的元素是一维数组的地址,前两行元素都是1，需要给前两个数组中的元素都赋值为1
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < i + 1; j++) {
                yangHuiArr[i][j] = 1;
            }
        }
        System.out.println(Arrays.deepToString(yangHuiArr));

        // 从第三行开始，首尾元素也是1
        for (int i = 2; i < yangHuiArr.length; i++) {
            // 首尾元素赋值为1
            yangHuiArr[i][0] = 1;
            // yangHuiArr[i][yangHuiArr[i].length - 1] = 1;
            yangHuiArr[i][i] = 1;
        }
        System.out.println(Arrays.deepToString(yangHuiArr));

        // 其它中间元素是同列上一行元素 + 左边一列上一行元素
        for (int i = 2; i < yangHuiArr.length; i++) {
            // 遍历其中的一维数组，给中间元素赋值
            for (int j = 1; j < yangHuiArr[i].length - 1; j++) {
                yangHuiArr[i][j] = yangHuiArr[i - 1][j] + yangHuiArr[i - 1][j - 1];
            }
        }
        System.out.println(Arrays.deepToString(yangHuiArr));
        // 3.按照杨辉三角的样式，打印二维数组
        for (int i = 0; i < yangHuiArr.length; i++) {
            for (int j = 0; j < yangHuiArr[i].length; j++) {
                System.out.print(yangHuiArr[i][j]+"\t\t");
            }
            System.out.println();
        }
    }
}
